package com.zsj.juc.reference;


import java.lang.ref.SoftReference;
import java.util.concurrent.TimeUnit;

/**
 * @author zsj
 * @version 1.0
 * @date 2024/5/19 17:01
 * @description 软引用
 */
public class SoftReferenceDemo {
    public static void main(String[] args) {
        TestObject testObject = new TestObject();
        //java中使用软引用需要包装
        SoftReference<TestObject> softReference = new SoftReference<>(testObject);
        System.out.println("gc 之前" + softReference.get());
        //因为我们的内存是16G  我们可以通过jvm参数设置允许的内存大小
        //-Xmx10m -Xms10m 来设置最大的内存大小
        System.gc();
        try {
            TimeUnit.MILLISECONDS.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("gc 之后 内存是够用的情况" + softReference.get());
        //软引用的垃圾回收机制是当内存不足的时候才会回收
        //比如这里我们创建一个10m大小的对象
        try {
            //这一行就会导致堆内存不够用了  导致我们的软引用对象被回收
            //我们创建了10MB的字节数组 1MB=1024*1024
            byte[] bytes = new byte[10 * 1024 * 1024];
        } finally {
            //看看会不会触发finalize方法
            System.out.println("这里内存肯定是不够了的" + softReference.get());
            //为什么这种写法 这里得到的不是null呢？
        }
    }
}
